﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
#include "common.h"

int count_rec = 0;

static int count_recursion(int n)
{ // 递归算法测试
	++count_rec;
	if (n == 0)
		return 1;
	else if (n == 1)
		return 2;
	else
		return count_recursion(n - 1) + count_recursion(n - 2);
}

static int lcm1(int a, int b)
{ // 两个正整数的最小公倍数，短除法（每次除以非 1 的最小公约数）
	int c = 2;
	int lcm_num = 1;
	while (c <= a / 2 && c <= b / 2)
	{
		while (a % c != 0 || b % c != 0 && c <= a / 2 && c <= b / 2)
			++c;
		if (c > a / 2 || c > b / 2)
			break;
		else
		{
			a = a / c;
			b = b / c;
			lcm_num *= c;
			c = 2; // 重置c
		}
	}
	return lcm_num * a * b;
}

static int lcm2(int a, int b)
{ // 两个正整数的最小公倍数，循环试除法
	int max_num = a > b ? a : b;
	while (1)
	{
		if (max_num % a == 0 && max_num % b == 0)
			break;
		else
			++max_num;
	}
	return max_num;
}

static int lcm3(int a, int b)
{ // 两个正整数的最小公倍数，循环先乘在除法
	int lcm_num = a > b ? a : b;
	int min_num = a < b ? a : b;
	int	i = 1;
	while (lcm_num * i % min_num != 0)
		++i;
	return lcm_num * i;
}

static void reverse_str(char* str, int left, int right)
{ // 逆序字符串
	char temp;
	while (left < right)
	{
		temp = str[left];
		str[left] = str[right];
		str[right] = temp;
		++left;
		--right;
	}
}

static void reverse_words(char* str, int left, int right)
{ // 逆序单词，以空格为分隔符
	if (' ' == str[right]) // 字符的本质是int，所以可以用 ==
		--right; // 跳过最后一个空格
	if (' ' == str[left])
		++left; // 跳过第一个空格
	reverse_str(str, left, right); // 先整体逆序
	right = left;
	while (str[right])  // '\0' == 0
	{
		++right;
		if (' ' == str[right])
		{
			reverse_str(str, left, right - 1);
			left = right + 1;
		}
	}
	reverse_str(str, left, right - 1); // 逆序最后一个单词
}


void test_work_three()
{
	print_start_line("测试小作业三部分开始");
	// 统计递归次数
	printf("函数返回值为：%d\n", count_recursion(8));
	printf("递归次数为：%d\n", count_rec);

	// 求最小公倍数
	printf("12 和 18 的最小公倍数为：%d\n", lcm1(12, 18));
	printf("20 和 72 的最小公倍数为：%d\n", lcm1(20, 72));
	printf("36 和 84 的最小公倍数为：%d\n", lcm1(36, 84));

	// 倒置字符串，将字符串中的单词倒置后输出，以空格分隔
	// 例如："i like infantile girls." -> "girls. infantile like i"
	char test_words[] = "oneself like cute girls.";
	/*char test_words[100] = {0};
	gets(test_words);
	int len = strlen(test_words);*/
	int len = sizeof test_words - 2;
	reverse_words(test_words, 0, len);
	printf("倒置后的字符串为：%s\n", test_words);
	print_end_line("测试小作业三部分结束");
}
